#ifndef __SEQUENCED_CHANNEL_H__
#define __SEQUENCED_CHANNEL_H__

/**
 * 顺序通道，数据包会按照前后顺序发送
 * 并且最新的数据包若对面没有回复 ack 包，则是会重发处理
 * 该通道在 reliable 为 true，可以保证最新数据能传输到对面
*/

#include "BaseChannel.h"

namespace LiteNetLib
{
    class SequencedChannel : public BaseChannel
    {
    private:
        // 用于记录发送的顺序值
        int32_t m_localSequence;

        uint16_t m_remoteSequence;
        // 是否是可靠通道，是可靠通道的话，发包没有收到对应的 ack 包的话，最新的数据包会重发处理
        bool m_reliable;

        // 最后一个包，当在可靠模式下，最后一个包没有收到对面的 ack 包时，是会做重发处理的
        NetPacket *m_lastPacket;
        std::mutex m_lastPacketMutex;
        
        // ack 包数据体，只有通道是可靠通道才会在创建通道对象时生成对应的 ack 包,不然就是 nullptr
        NetPacket *m_ackPacket;

        // 通道收到非 ack 的其它包，是否需要发送 ack 包通知对面已经这边已经收到数据包了。
        bool m_mustSendAck;

        // 通道id ，用于区分不同通道
        uint8_t m_channelId;

        // 用于计算重发时间
        int64_t m_lastPacketSendTime;

    public:
        SequencedChannel(NetPeer *netPeer, bool reliable, uint8_t channelId);
        virtual ~SequencedChannel();
        virtual void clear() override;

    protected:
        virtual bool sendNextPackets() override;
        virtual bool processData(const char* dataBuff, uint32_t dataSize) override;
    };

}

#endif
